/*
 * led.c
 *
 *  Created on: 2022年3月8日
 *      Author: yinjunlin
 */
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>

#include "esp_system.h"
#include "esp_netif.h"

#include "driver/rmt.h"
#include "led_strip.h"

#define RMT_TX_CHANNEL RMT_CHANNEL_0  //RMT channel number 0
int c2i(char ch);
int hex2dec(char *hex);
 led_strip_t *strip;
/*
 * 将字符转换为数值
 * */
int c2i(char ch)
{
	// 如果是数字，则用数字的ASCII码减去48, 如果ch = '2' ,则 '2' - 48 = 2
	if (isdigit(ch))
	return ch - 48;

	// 如果是字母，但不是A~F,a~f则返回
	if (ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z')
	{
		if (ch == '#')
		{
			return 0;
		}
		return -1;
	}
	// 如果是大写字母，则用数字的ASCII码减去55, 如果ch = 'A' ,则 'A' - 55 = 10
	// 如果是小写字母，则用数字的ASCII码减去87, 如果ch = 'a' ,则 'a' - 87 = 10
	if (isalpha(ch))
	return isupper(ch) ? ch - 55 : ch - 87;

	//以上情况都不是
	return -1;
}

/*
 * 功能：将十六进制字符串转换为整型(int)数值
 * */

int hex2dec(char *hex)
{
	int len;
	int num = 0;
	int temp;
	int bits;
	int i;

	// 当 字符hex = "1de" 长度为3, hex是main函数传递的，得到的返回值是0x1de
	len = strlen(hex);

	for (i = 0, temp = 0; i < len; i++, temp = 0)
	{
		// 第一次：i=0, *(hex + i) = *(hex + 0) = '1', 即temp = 1
		// 第二次：i=1, *(hex + i) = *(hex + 1) = 'd', 即temp = 13
		// 第三次：i=2, *(hex + i) = *(hex + 2) = 'e', 即temp = 14
		temp = c2i(*(hex + i));
		// 总共3位，一个16进制位用 4 bit保存
		// 第一次：'1'为最高位，所以temp左移 (len - i -1) * 4 = 2 * 4 = 8 位
		// 第二次：'d'为次高位，所以temp左移 (len - i -1) * 4 = 1 * 4 = 4 位
		// 第三次：'e'为最低位，所以temp左移 (len - i -1) * 4 = 0 * 4 = 0 位
		bits = (len - i - 1) * 4;
		temp = temp << bits;

		// 此处也可以用 num += temp;进行累加
		num = num | temp;
	}

	// 返回结果
	return num;
}
void  led_set_rgb_int(void)
	{
		rmt_config_t config =
		RMT_DEFAULT_CONFIG_TX(CONFIG_LED_GPIO, RMT_TX_CHANNEL);//GPIO_26输出
		config.clk_div = 2;
		rmt_config(&config);
		rmt_driver_install(config.channel, 0, 0);
		led_strip_config_t strip_config =
									LED_STRIP_DEFAULT_CONFIG(CONFIG_LED_NUMBER, (led_strip_dev_t)config.channel);
					strip = led_strip_new_rmt_ws2812(&strip_config);

	}
void led_set_rgb(char* string )
{
	int rgb = hex2dec(string);
	uint32_t green = 0x00ff00 & rgb;
	green = green >> 8;
	uint32_t red = 0xff0000 & rgb;
	red = red >> 16;
	uint32_t blue = 0x0000ff & rgb;
	for (int j = 0; j < CONFIG_LED_NUMBER; j += 1)
	{
		//Write RGB values to strip driver
		ESP_ERROR_CHECK(strip->set_pixel(strip, j, red, green, blue));//Set RGB for a specific pixel
	}

	ESP_ERROR_CHECK(strip->refresh(strip, 100));//Refresh memory colors to LEDs

}

